package com.mastercard.assets.web.struts.actions;

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import com.mastercard.assets.MasterCardException;
import com.mastercard.assets.jpa.TblAlertaUsuario;
import com.mastercard.assets.jpa.TblCuenta;
import com.mastercard.assets.jpa.TblFormaAlerta;
import com.mastercard.assets.jpa.TblRole;
import com.mastercard.assets.jpa.TblTipoCuenta;
import com.mastercard.assets.jpa.TblUsuario;
import com.mastercard.assets.util.MCUtil;
import com.mastercard.assets.util.dao.MasterCardDAO;
import com.mastercard.assets.web.util.to.UserLogin;
import java.util.ArrayList;

public class LoginIndex
	extends
		Action
{
	public ActionForward execute(
							ActionMapping mapping , 
							ActionForm form ,
							HttpServletRequest request , 
							HttpServletResponse response )
		throws 
			IOException , 
			ServletException
	{
		HttpSession session = request.getSession( ) ;
		
		// en caos de null
		if( session == null )
			return mapping.findForward( "noLogin" ) ;
		
		// toma el userLogin
		UserLogin user = ( UserLogin ) session.getAttribute( "UserLogin" ) ;
		
		// en caso de null
		if( user == null )
			return mapping.findForward( "noLogin" ) ;
		
		// en caso de no null
		// toma los roles
		List< TblRole > roles = user.getUserRoles( ) ;
		
		// en caso de null
		if( roles == null )
			return mapping.findForward( "noLogin" ) ;
		
		// en caso de no null
		// verifica cuantos son
		int numroles = roles.size( ) ;
		
		// en caso de que sean mas de uno
		if( numroles > 1 )
		{
			// coloca en el request la indicacion
                    if( user.getIdioma( ) == 0 ) {
                        return mapping.findForward( "RolesMoreThanOne" ) ;
                    } else
			return mapping.findForward( "RolesMoreThanOneEng" ) ;
		}
		// en csao de que solo sea uno
		else
		{
			// asigna el role
			try
			{
				int cveRole = roles.get( 0 ).getCveRole( ) ;
				user.setActualRoleId( cveRole ) ;
				
				// verifica numero de cuentas
				List< TblCuenta > cuentas = user.getUserCounts( ) ;
				
				// tamanio de cuentas
				if( cuentas == null )
					return mapping.findForward( "noLogin" ) ;
                                
                                if( cveRole == 5 )
                                {
                                    TblUsuario userData = MasterCardDAO.findUserById( user.getCveUsuario( ) ) ;
                                    MasterCardDAO.closeEntityManager( ) ;
                                    List< TblTipoCuenta > TCUser = userData.getTblTipoCuentas( ) ;
                                    user.setCountType( TCUser.get( 0 ) ) ;
                                }
				
				int cuentasSize = cuentas.size( ) ;
				
				// en caso de mayor de 1
				if( cuentasSize > 1 )
				{
					if( user.getIdioma( ) == 0 ) {
                                            return mapping.findForward( "CountsMoreThanOne" ) ;
                                        }else
                                            return mapping.findForward( "CountsMoreThanOneEng" ) ;                                    
				}
				// en caso de que no haya cuentas
				else if( cuentasSize == 0 )
				{
					// en caso d que sea rol 2 (CM) o 4 (Agencia) o 6(Regional) o 5(BDM Titular), no aplica
					if( cveRole != 2 && cveRole != 4 && cveRole != 6 && cveRole != 7 && cveRole != 8 && cveRole != 5
                                                && cveRole != 10)
					{
						user.setMessageError( MCUtil.messages.getString( "com.mastercard.assets.web.errors.dao.login.NoCountExist" ) ) ;
						
						request.setAttribute( "LoginForm" , form ) ;
						
						return mapping.findForward( "noLogin" ) ;
					}
					
					// se va a loguearse
				}
				else
				{
					// coloca la cuenta actual
					user.setActualCountId( cuentas.get( 0 ).getCveCuenta( ) ) ;                                        
				}
                                
// ___________________________________________      Calcula alertas     ___________________________________________
List<TblAlertaUsuario> sinLeer = MasterCardDAO.getNoLeidas( user.getCveUsuario( ) ) ; // user.getAlertsNotReaded( ) ;
int cuentaAlerta = 0, cuenta = user.getActualCountId( ) ;
        

List< TblAlertaUsuario> resSinLeer = new ArrayList< TblAlertaUsuario>();

// valida el rol
if (cveRole == 2) {
    // recorre alertas sin leer
    for (TblAlertaUsuario alert : sinLeer) {
        int clvRol = 0;

        // la alerta debe tener la clave del usuario
        if (alert.getTblUsuario().getCveUsuario() == user.getCveUsuario( )) {
            
            if( alert.getTblNotificacion( ) == null ){
                List< TblFormaAlerta > fa = alert.getTblAlerta( ).getTblFormaAlertas( ) ;
                            
                for( TblFormaAlerta FA : fa ){
                    
                    if( ( FA.getTipo( ) == 3 || FA.getTipo( ) == 2 ) &&( FA.getTblRole( ).getCveRole( ) == cveRole ) ){
                        resSinLeer.add(alert);
                    }
                }
            }else{
                
                int alNot = alert.getTblNotificacion().getTblRole().getCveRole();                        

                if (alNot == cveRole) {
                    clvRol = 1;
                }

                if (clvRol == 1) {
                    resSinLeer.add(alert);
                }
                            
            }
          }
       }

} else {
    
    // recorre alertas sin leer
    for (TblAlertaUsuario alert : sinLeer) {
        int clvRol = 0;
        // si tiene numero de cuenta
        if (alert.getTblCuenta() != null) {
            cuentaAlerta = alert.getTblCuenta().getCveCuenta();
                    
            // la alerta debe tener la clave del usuario
            if (alert.getTblUsuario().getCveUsuario() == user.getCveUsuario( ) && cuentaAlerta == cuenta) {
                
                if( alert.getTblNotificacion( ) == null ) {
                    
                    List< TblFormaAlerta > fa = alert.getTblAlerta( ).getTblFormaAlertas( ) ;
                            
                    for( TblFormaAlerta FA : fa ) {
                        if( ( FA.getTipo( ) == 3 || FA.getTipo( ) == 2 ) &&( FA.getTblRole( ).getCveRole( ) == cveRole ) ) {
                            resSinLeer.add(alert);
                        }
                    }
                }else{
                    
                    int alNot = alert.getTblNotificacion().getTblRole().getCveRole();
                    
                    if (alNot == cveRole) {
                        clvRol = 1;
                    }

                    if (clvRol == 1) {
                        resSinLeer.add(alert);
                    }
                    
                            
                }
            }
        }// sin no tiene numero de ceunta
         else
            if ( alert.getTblNotificacion().getTblRole().getCveRole() == cveRole
                    && alert.getTblUsuario().getCveUsuario() == user.getCveUsuario( ) 
                    && alert.getLeida() == 1 && (alert.getTblNotificacion().getTipoNotificacion() > 6 ||
                    alert.getTblNotificacion().getTipoNotificacion() == 1 || alert.getTblNotificacion().getTipoNotificacion() == 2 ) )
                
                resSinLeer.add(alert);

            }

        }

user.setNumAler( resSinLeer.size( ) ) ;
// ___________________________________________      Calcula alertas     ___________________________________________                                
                                
			}catch( MasterCardException mce )
			{
				// en caso de que sea el primer error
				if( mce.getErrorCode( ) == MCUtil.MASTERCARD_ERROR_CODE_USERLOGIN_USER_MUST_BE_LOGGEDIN )
				  	return mapping.findForward( "noLogin" ) ;
				// en caso contrario
				else
				  	return mapping.findForward( "success" ) ;
			}
		}
               
	  	return mapping.findForward( "success" ) ;
	}
	
}
